Workflow code examples using TOM.NET

This topic contains a number of code samples for programmatically working with workflow using the TOM.NET API.

Basic code header

To provide some context, here is the class definition for a class that could contain the methods below.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Security;
using Tridion.ContentManager.Workflow;

namespace MyOrganization.ContentManager.Tests
{
	public class CodeSample
	{
		Session _Session = new Session("User_Name");

		// Methods below go here.
	}
}

Creating a Task

The following code creates a Task, a simple Workflow Process based on the predefined Task Process Definition.

public ProcessInstance CreateTask(Publication publication, TcmUri userId)
{
	Trustee assignee = (Trustee) _Session.GetObject(userId);

	StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
	{
		ProcessInstanceTitle = "Title of the Task",
		ActivityTitle = "Title of the First Activity in the Task",
		Assignee = assignee
	};

	return publication.StartWorkflow(instruction);
}

Creating a Process Instance

This first method creates a Process Instance based on a Process Definition as a part of starting the Workflow Process.

public ProcessInstance CreateProcessInstanceMethod1(TcmUri processDefinitionId)
{
	ProcessDefinition processDefinition = 
		(ProcessDefinition) _Session.GetObject(processDefinitionId);
	Publication publication = (Publication) processDefinition.ContextRepository;

	StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
	{
		ProcessDefinition = processDefinition,
		ProcessInstanceTitle = "Title of the Process Instance",
		// Optional: if unspecified, the name of the Activity Definition is used.
		ActivityTitle = "Title of the First Activity" 
	};

	return publication.StartWorkflow(instruction);
}

Creating a Process Instance with Subjects

The following code creates a Process Instance and adds Subjects to it on the fly.

public ProcessInstance CreateProcessInstanceWithSubjects(TcmUri processDefinitionId, params IWorkflowItem[] itemsToAdd)
{
	ProcessDefinition processDefinition = 
		(ProcessDefinition) _Session.GetObject(processDefinitionId);
	Publication publication = (Publication) processDefinition.ContextRepository;

	StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
	{
		ProcessDefinition = processDefinition,
		ProcessInstanceTitle = "Title of the Process Instance",
		// Optional: if unspecified, the name of the Activity Definition is used.
		ActivityTitle = "Title of the First Activity"
	};
	foreach(var workflowItem in itemsToAdd)
	{
		instruction.Subjects.Add(workflowItem);
	}

	return publication.StartWorkflow(instruction);
}

Adding items to workflow

The following code adds an array of items (Subjects) to a specific Activity Instance.

public void AddItemsToWorkflow(TcmUri activityInstanceId, params IWorkflowItem[] itemsToAdd)
{
	ActivityInstance activityInstance = 
		(ActivityInstance) _Session.GetObject(activityInstanceId);
	foreach (var workflowItem in itemsToAdd)
	{
		workflowItem.AddToWorkflow(activityInstance);
	}
}

Removing items from workflow

The following code removes items from workflow.

public void RemoveItemsFromWorkflow(params IWorkflowItem[] itemsToRemove)
{
	foreach (var workflowItem in itemsToRemove)
	{
		workflowItem.RemoveFromWorkflow();
	}
}

Setting the title of an Activity

This code dynamically sets the title of the first and of the next Activity in a Process.

public void SetTitleOfActivityInstance(TcmUri processDefinitionId)
{
	ProcessDefinition processDefinition = (ProcessDefinition) _Session.GetObject(processDefinitionId);
	Publication publication = (Publication) processDefinition.ContextRepository;

	// To set the Activity Instance Title of the first Activity of the Process
	StartWorkflowInstruction instruction = new StartWorkflowInstruction(_Session)
	{
		ProcessDefinition = processDefinition,
		ProcessInstanceTitle = "Title of the Process Instance",
		// Optional: if unspecified, the name of the Activity Definition is used.
		ActivityTitle = "Title of the First Activity"
	};
	ProcessInstance processInstance = publication.StartWorkflow(instruction);

	// To set the title of the intermediate Activity of the Process
	ActivityInstance activityInstance = (ActivityInstance) processInstance.Activities.First();

	activityInstance.Finish(new ActivityFinish("Activity Finish Message", _Session.User, _Session)
		{
			NextActivityTitle = "Next Activity Instance Title"
		});
}

Creating a Process Definition with Activity constraints

The following code sets constraints on some of the Activities in a Process Definition.

public TridionProcessDefinition 
	CreateProcessDefinitionWithActivityConstraints(TcmUri publicationId,
		string title,
		bool hasSnapshot,
		ApprovalStatus approvalStatus1 = null,
		ApprovalStatus approvalStatus2 = null,
		TcmUri assigneeId = null,
		bool AllowOverrideDueDate1 = true,
		uint PerformingTimeout1 = 0U,
		bool AllowOverrideDueDate2 = true,
		uint PerformingTimeout2 = 0)

{
	Publication publication = new Publication(publicationId, _Session);

	TridionActivityDefinition step2 = new TridionActivityDefinition(publication)
	{
		Title = "Step 2",
		ActivityType = ActivityType.Normal,
		Description = "This is the second and final step of the Process",
		AllowOverrideDueDate = AllowOverrideDueDate2,
		PerformingTimeout = PerformingTimeout2
		ActivityConstraints = ActivityConstraints.DenyAddRemoveWorkItem
	};

	if (approvalStatus2 != null)
	{
		step2.FinishApprovalStatus = approvalStatus2;
	}

	TridionActivityDefinition step1 = new TridionActivityDefinition(publication)
	{
		Title = "Step 1",
		ActivityType = ActivityType.Normal,
		Description = "This is the first step of the Process",
		Assignee = (Trustee) _Session.GetObject(assigneeId),
		ActivityConstraints = ActivityConstraints.DenySubjectEditing | ActivityConstraints.DenyBundleMetadataEditing,
		AllowOverrideDueDate = AllowOverrideDueDate1,
		PerformingTimeout = PerformingTimeout1,
		NextActivityDefinitions =
		{
			step2
		}
	};

	if (approvalStatus1 != null)
	{
		step1.FinishApprovalStatus = approvalStatus1;
	}

	TridionProcessDefinition processDefinition = 
		new TridionProcessDefinition(_Session, publicationId)
		{
			Title = title,
			ActivityDefinitions = new List<TridionActivityDefinition>
			{
				step1,
				step2
			}
		};
	processDefinition.Save();

	return processDefinition;
}